package com.zyg.cod.util;

import org.apache.log4j.Logger;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Dsc:  自定义 反射工具类
 * @Author: zyg
 * @Date: 2021/1/28
 */
public class ClassUtils {
	public static Logger log = Logger.getLogger(ClassUtils.class);
	/**
	 * 根据属性名获取属性值
	 * */
	private static Object getFieldValueByName(String fieldName, Object o) {
		try {
			String firstLetter = fieldName.substring(0, 1).toUpperCase();
			String getter = "get" + firstLetter + fieldName.substring(1);
			Method method = o.getClass().getMethod(getter, new Class[] {});
			Object value = method.invoke(o, new Object[] {});
			return value;
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			return null;
		}
	}

	/**
	 * 获取属性名数组
	 * */
	private static String[] getFiledName(Object o){
		Field[] fields=o.getClass().getDeclaredFields();
		String[] fieldNames=new String[fields.length];
		for(int i=0;i<fields.length;i++){
			System.out.println(fields[i].getType());
			fieldNames[i]=fields[i].getName();
		}
		return fieldNames;
	}

	/**
	 * 获取属性类型(type)，属性名(name)，属性值(value)的map组成的list
	 * */
	private static List getFiledsInfo(Object o){
		Field[] fields=o.getClass().getDeclaredFields();
		String[] fieldNames=new String[fields.length];
		List list = new ArrayList();
		Map infoMap=null;
		for(int i=0;i<fields.length;i++){
			infoMap = new HashMap();
			infoMap.put("type", fields[i].getType().toString());
			infoMap.put("name", fields[i].getName());
			infoMap.put("value", getFieldValueByName(fields[i].getName(), o));
			list.add(infoMap);
		}
		return list;
	}

	/**
	 * 获取对象的所有属性值，返回一个对象数组
	 * */
	public Object[] getFiledValues(Object o){
		String[] fieldNames=this.getFiledName(o);
		Object[] value=new Object[fieldNames.length];
		for(int i=0;i<fieldNames.length;i++){
			value[i]=this.getFieldValueByName(fieldNames[i], o);
		}
		return value;
	}
}
